package com.asambleacristiana.bean;

import java.util.Calendar;
import java.util.Date;

import org.apache.poi.util.StringUtil;

import com.asambleacristiana.domain.Cuenta;
import com.asambleacristiana.domain.CuentaEnum;
import com.asambleacristiana.domain.MesesEnum;
import com.asambleacristiana.domain.Movimiento;
import com.asambleacristiana.domain.TipoOperacion;
import com.asambleacristiana.domain.TipoOperacionEnum;
import com.asambleacristiana.domain.Zona;
import com.asambleacristiana.repository.dao.DAOFactoryJPA;
import com.asambleacristiana.utils.FechaUtils;

public class MovimientoFondoComun {

	private int anio;
	private int mes;
	private Zona zona;
	private Double importeTotalMes = 0D;
	private Movimiento ingreso;
	private Movimiento egreso;
	private static Double PORCENTAJE = 0.3;
	private static String DETALLE = "Transferencia al Fondo Común del 30\\% de los ingresos del mes de % en la filial %";
	private boolean registrado;

	public MovimientoFondoComun() {
	}

	public MovimientoFondoComun(int anio, int mes, Zona zona, String apodo) {
		this.anio = anio;
		this.mes = mes;
		this.zona = zona;
		crearMovimiento(apodo);
	}

	private void crearMovimiento(String apodo) {
		TipoOperacion tipoEgreso = DAOFactoryJPA.getInstance().getTipoOperacionDAO().findById(TipoOperacionEnum.egreso.getCodigo());
		TipoOperacion tipoIngreso = DAOFactoryJPA.getInstance().getTipoOperacionDAO().findById(TipoOperacionEnum.ingreso.getCodigo());
		Zona fondoComun = DAOFactoryJPA.getInstance().getZonaDAO().findById(1);
		Cuenta caja = DAOFactoryJPA.getInstance().getCuentaDAO().findById(CuentaEnum.caja.getCodigo());
		Cuenta transferenciasAfiliales = DAOFactoryJPA.getInstance().getCuentaDAO().findById(CuentaEnum.transferenciasAFiliales.getCodigo());
		Cuenta transferenciasDeFiliales = DAOFactoryJPA.getInstance().getCuentaDAO().findById(CuentaEnum.transferenciasDeFiliales.getCodigo());
		Date ultimaFechaMes = FechaUtils.getUltimoDiaDelMes(anio,mes);
		importeTotalMes = ingresoTotalMes(zona, anio, mes);
		Double importeMes = getAporteMes();
		String datos[] = {MesesEnum.values()[mes].name()+ " de "+Calendar.getInstance().get(Calendar.YEAR),zona.getNombre()};
		String mensaje = StringUtil.format(DETALLE, datos);
		egreso = new Movimiento(zona, ultimaFechaMes, tipoEgreso, caja, transferenciasAfiliales, importeMes, mensaje, apodo, null, null, null);
		ingreso = new Movimiento(fondoComun, ultimaFechaMes, tipoIngreso,  transferenciasDeFiliales, caja, importeMes, mensaje, "system", null, null, null);
	}

	private Double ingresoTotalMes(Zona zona,int anio, int mes) {
		Date desde = FechaUtils.getPrimerDiaDelMes(anio,mes);
		Date hasta = FechaUtils.getUltimoDiaDelMes(anio,mes);
		Double importe = DAOFactoryJPA.getInstance().getMovimientoDAO().findIngresosByFilial(zona.getCodigo(), desde, hasta);
		return importe == null ? 0D : importe;
	}

	public Double getAporteMes() {
		return importeTotalMes * PORCENTAJE;
	}

	public int getMes() {
		return mes;
	}

	public void setMes(int mes) {
		this.mes = mes;
	}

	public void setZona(Zona zona) {
		this.zona = zona;
	}

	public Zona getZona() {
		return zona;
	}

	public void setEgreso(Movimiento egreso) {
		this.egreso = egreso;
	}

	public Movimiento getEgreso() {
		return egreso;
	}

	public void setIngreso(Movimiento ingreso) {
		this.ingreso = ingreso;
	}

	public Movimiento getIngreso() {
		return ingreso;
	}

	public void setImporteTotal(Double importeTotal) {
		this.importeTotalMes = importeTotal;
	}

	public Double getImporteTotal() {
		return importeTotalMes;
	}

	public void setRegistrado(boolean registrado) {
		this.registrado = registrado;
	}

	public boolean isRegistrado() {
		return registrado;
	}

	public Double getImporteTotalMes() {
		return importeTotalMes;
	}

	public void setImporteTotalMes(Double importeTotalMes) {
		this.importeTotalMes = importeTotalMes;
	}

}
